<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    /*
    给出的几个变量: arr、k、threshold，关键词: 子数组、数目
    子数组指的是连续数组，看评论好多同学都以为是不连续数组
    子数组的长度为k，且平均值>=threshold，那么子数组的和必定>= k * threshold
    我们要求的结果就是数目这个变量，这里至少可以想到代码中肯定要定义这么个变量，比如: nums
*/
    var numsOfsubarray = function (arr, k, threshold) {
      let sums = 0; // 子数组的和
      let nums = 0; // 最后返回值，即符合条件的子数组个数
      let len = arr.length; // 数组的长度
      let target = k * threshold; // 子数组的目标和，大于等于这个值就满足条件
      // 判断边界条件, 数组的长度 < 给定的子数组的长度, 必然不符合
      if (len < k) return 0;
      // 初始子数组的和
      for (let i = 0; i < k; i++) sums += arr[i];
      // 如果初始子数组就满足条件，nums加1
      if (sums >= target) nums++;
      for (let i = k; i < len; i++) {
        // 这两步是整个算法的关键
        // 新子数组和计算，即老子数组的和减去老子数组的第一个index的值，再加上当前index的值
        // 可以理解为长度为k的窗口往后移动一位
        sums -= arr[i - k]; // i = 3, k = 3, 就是减去arr[0]
        sums += arr[i]; // 再加上arr[3]
        if (sums >= target) nums++;
      }
      return nums;
    };
    console.log(numsOfsubarray(
      arr = [2, 2, 2, 2, 5, 5, 5, 8],
      k = 3,
      threshold = 4))
  </script>
</body>

</html>